#include "PT_2020_DRIVE.H"

/**
  * 函数名称：bit PT2020_I2C_WriteData(unsigned char regAdd,unsigned char u8_data)
  * 函数功能：写PT2020寄存器写入值
  * 入口参数：unsigned char regAdd：要写入的寄存器的地址
  *          unsigned char u8_data：要写入的值
  * 出口参数：M_TRUE：写入成功
  *          M_FALSE：写入失败
  */
bit PT2020_I2C_WriteData(unsigned char regAdd,unsigned char u8_data)
{	
	PT2020_I2C_Start();
	
	PT2020_I2C_WriteByte(PT2020_ID_SEL_Address | 0x00);  
	if(PT2020_I2C_SlaveAck() != M_ACK)		
	{
		return M_FAIL;
	}
	
//	if(PT2020_I2C_WaitCLKAW(regAdd) != M_TRUE)
//	{
//		return M_FALSE;
//	}
	PT2020_I2C_WriteByte(regAdd);            
	if(PT2020_I2C_SlaveAck() != M_ACK)
	{
		return M_FAIL;
	}
//	if(PT2020_I2C_WaitCLKAW(u8_data) != M_TRUE)
//	{
//		return M_FALSE;
//	}
	PT2020_I2C_WriteByte(u8_data);          
	if(PT2020_I2C_SlaveAck() != M_ACK)
	{
		return M_FAIL;
	}
	PT2020_I2C_Stop();                
	return M_TRUE;
}



/*****************************************************
函数名称：bit PT2020_I2C_ContWriteData(unsigned char u8_data)
函数功能：向PT2020地址regAdd寄存器连续写入*P指向的R_L个数据
入口参数：unsigned char regAdd：要写入的寄存器的首地址
          unsigned char *P：要写入的数据指针
          unsigned char R_L：写入的数据长度
出口参数：M_TRUE：写入成功
          M_FAIL：写入失败
*****************************************************/
bit PT2020_I2C_ContWriteData(unsigned char regAdd,unsigned char code *P,unsigned char R_L)
{
     //往regAdd地址连续写入数据
    PT2020_I2C_Start();                                  //Start
    PT2020_I2C_WriteByte(PT2020_ID_SEL_Address | 0x00);  //Device Address 设备地址|向PT2020写数据
    if(PT2020_I2C_SlaveAck() != M_ACK)                   //ACK
    {
        PT2020_I2C_Stop();
        return M_FAIL;
    } 
    if(PT2020_I2C_WaitCLKAW(regAdd) != M_TRUE)           //等待PT2020释放CLK
    {
        PT2020_I2C_Stop();
        return M_FAIL;
    }
    PT2020_I2C_WriteByte(regAdd);                        //Register Address
    if(PT2020_I2C_SlaveAck() != M_ACK)                   //ACK
    {
        PT2020_I2C_Stop();
        return M_FAIL;
    }
    PT2020_I2C_ContWriteData_LOOP:
    if(PT2020_I2C_WaitCLKAW(*P) != M_TRUE)               //等待PT2020释放CLK
    {
        PT2020_I2C_Stop();
        return M_FAIL;
    }
    PT2020_I2C_WriteByte(*P);                            //DATA 
    if(PT2020_I2C_SlaveAck() != M_ACK)                   //ACK
    {
        PT2020_I2C_Stop();
        return M_FAIL;
    }
    if(R_L) R_L--;
    if(R_L) {P++;goto PT2020_I2C_ContWriteData_LOOP;}
    PT2020_I2C_Stop();                                   //Stop
    return M_TRUE;
}
/**
  * 函数名称：unsigned char PT2020_I2C_ReadData(unsigned char regAdd)
  * 函数功能：读PT2020寄存器的值
  * 入口参数：unsigned char regAdd：要读取的寄存器的地址     
  * 出口参数：unsigned char u8_data：读取的数据
  *          M_FALSE：读取失败
  */
unsigned int PT2020_I2C_ReadData(unsigned char regAdd)
{
	unsigned char u8_data;           //读取的数据
	PT2020_I2C_Start();
	PT2020_I2C_WriteByte(PT2020_ID_SEL_Address | 0x00);  //设备地址和写方向
	if(PT2020_I2C_SlaveAck() != M_ACK)
	{
		PT2020_I2C_Stop(); 
		return MR_FAIL;
	}
//    if(PT2020_I2C_WaitCLKAW(regAdd) != M_TRUE)
//	{
//		return MR_FALSE;
//	}
	PT2020_I2C_WriteByte(regAdd);            //寄存器内部地址
	if(PT2020_I2C_SlaveAck() != M_ACK)
	{
		PT2020_I2C_Stop(); 
		return MR_FAIL;
	}	
  //	PT2020_I2C_Stop();  可写可不写

//	if(R_INIT)
//  {   
//      F_I2C_DISP=1;//=1主循环读键值时，若进中断不扫灯
//	    PT_LED_COM_N_SCAN();
//      F_I2C_DISP=0; 
//	}
	PT2020_I2C_Start();
	PT2020_I2C_WriteByte(PT2020_ID_SEL_Address | 0x01);  //设备地址和读方向
	if(PT2020_I2C_SlaveAck() != M_ACK)
	{
		PT2020_I2C_Stop(); 
		return MR_FAIL;
	}
//	if(PT2020_I2C_WaitCLKAR() != M_TRUE)
//	{
//		return MR_FALSE;
//	}
	
	u8_data = PT2020_I2C_ReadByte();
	
	PT2020_I2C_MasterSendAck(M_NACK);              //停止信号前发送非应答信号
	PT2020_I2C_Stop();
	return u8_data;
}


/*****************************************************
函数名称：unsigned int PT2020_I2C_ContReadData(unsigned char regAdd)
函数功能：读PT2020寄存器的值，要读出的寄存器地址根据历史地址顺延
入口参数：无
出口参数：unsigned char u8_data：读取的数据
          MR_FAIL：读取失败=0x100
******************************************************/
void PT2020_I2C_ContReadData(unsigned char regAdd,unsigned int *P,unsigned char R_L)
{
    //*********写需读取的寄存器地址************************    
    PT2020_I2C_Start();                                 //Start
    PT2020_I2C_WriteByte(PT2020_ID_SEL_Address | 0x00); //Device Address 设备地址|向PT2020写数据
    if(PT2020_I2C_SlaveAck() != M_ACK)                  //ACK
    {
        PT2020_I2C_Stop(); 
        *P=0x100;
        return;
    }
    if(PT2020_I2C_WaitCLKAW(regAdd) != M_TRUE)          //等待PT2020释放CLK
    {
        PT2020_I2C_Stop();
        *P=0x100;
        return;
    }
    PT2020_I2C_WriteByte(regAdd);                       //Register Address
    if(PT2020_I2C_SlaveAck() != M_ACK)                  //ACK
    {
        PT2020_I2C_Stop(); 
        *P=0x100;
        return;
    }
//    PT2020_I2C_Stop();                                  //Stop
    //*********写需读取的寄存器地址完成******************

    //*********读取寄存器地址数据************************
    PT2020_I2C_Start();                                 //Start
    PT2020_I2C_WriteByte(PT2020_ID_SEL_Address | 0x01); //Device Address 设备地址|向PT2020读数据
    if(PT2020_I2C_SlaveAck() != M_ACK)                  //ACK
    {
        PT2020_I2C_Stop(); 
        *P=0x100;
        return;
    }
     PT2020_I2C_ContReadData_LOOP:   
    if(PT2020_I2C_WaitCLKAR() != M_TRUE)                //等待PT2020释放CLK
    {
        PT2020_I2C_Stop();
        *P=0x100;
        return;
    }

    *P = PT2020_I2C_ReadByte();                          //Data read Address     
    if(R_L) R_L--;
    if(R_L) 
    {
        P++;
        PT2020_I2C_MasterSendAck(M_ACK);                //ACK   
        goto PT2020_I2C_ContReadData_LOOP;   
    }
    PT2020_I2C_MasterSendAck(M_NACK);                   //NACK
    PT2020_I2C_Stop();                                  //Stop
    return;
}
/*****************************************************
函数名称：void PT2020_I2C_Start()
函数功能：I2C起始信号发送
入口参数：void
出口参数：void
******************************************************/
void PT2020_I2C_Start()
{
    SDA_OUT;    //设SDA为输出口
    SCL_OUT;    //设SCL为输出口
   
    SDA = 1;
    SCL = 1;
    delay_us(5);
    SDA = 0;
    delay_us(5);
    SCL = 0;
    delay_us(5);
}
/*****************************************************
  * 函数名称：void PT2020_I2C_Stop()
  * 函数功能：I2C停止信号发送
  * 入口参数：void
  * 出口参数：void
******************************************************/
void PT2020_I2C_Stop()
{
    SDA_OUT;
    SCL_OUT;

    SDA = 0;
    SCL = 1;

    delay_us(5);
    SDA = 1;
    delay_us(5);
}
/*****************************************************
函数名称：PT2020_I2C_MasterSendAck(bit isAck)
函数功能：I2C主机发送应答位
入口参数：bit isAck 应答位设置  0：应答    1：非应答
出口参数：void
******************************************************/
void PT2020_I2C_MasterSendAck(bit isAck)
{
    SCL_OUT;
    SDA_OUT;

    if(isAck == M_ACK)
    {
        SDA = 0;
    }
    else
    {
        SDA = 1;
    }
    SCL = 1;
    delay_us(5);
    SCL = 0;
    delay_us(5);
}
/*****************************************************
函数名称：void PT2020_I2C_SlaveAck()
函数功能：从机I2C应答
入口参数：void
出口参数：M_ACK ：收到应答位
          M_NACK：收到非应答位
******************************************************/
bit PT2020_I2C_SlaveAck()
{
    SDA_IN;
    SCL_OUT;
    SCL = 1;
    delay_us(5);
    if(SDA == M_NACK)
    {
        SCL = 0;
        delay_us(5);
        return M_NACK;
    }
    SCL = 0;
    delay_us(5);
    return M_ACK; 
}
/*****************************************************
  * 函数名称：void PT2020_I2C_WriteByte(unsigned char u8_data)
  * 函数功能：I2C发送1个Byte数据
  * 入口参数：unsigned char u8_data ：要发送的数据
  * 出口参数：void
******************************************************/
void PT2020_I2C_WriteByte(unsigned char u8_data)
{
    unsigned char i;
    SDA_OUT;
    SCL_OUT;
    for(i=8;i>0;i--)
    {
        if((u8_data & 0x80) == 0x80)
        {
            SDA = 1;
        }
        else
        {
            SDA = 0;
        }
        u8_data <<= 1;
        SCL = 1;
        delay_us(5);
        SCL = 0;
        delay_us(5);
    }
}
/*****************************************************
函数名称：unsigned char PT2020_I2C_ReadByte()
函数功能：I2C读取1个Byte数据
入口参数：void
出口参数：unsigned char u8_data：读到的8bit数据
******************************************************/
unsigned char PT2020_I2C_ReadByte()
{
    unsigned char i;
    unsigned char u8_data = 0x00;
    SDA_IN;
    SCL_OUT;
 
    for(i=8;i>0;i--)
    {
        SCL = 1;
        delay_us(5);
        u8_data <<= 1;
        if(SDA == M_SET)
        {
            u8_data |= 0x01;
        }
        SCL = 0;
        delay_us(5);
    }
    return u8_data;
}
/*****************************************************
函数名称：bit PT2020_I2C_WaitCLKAR()
函数功能：读数据前等待从机释放SCL
入口参数：void
出口参数：M_TRUE：成功等到从机释放SCL
          M_FAIL：等待从机释放SCL超时
******************************************************/
bit PT2020_I2C_WaitCLKAR()
{
    unsigned char i;
    SCL_IN;
    SDA_IN;//xie  
    delay_us(1);
    while(SCL != 1)
    {
        i++;
        if(i>300)
        {
            return M_FAIL;
        }
    }
    SCL = 1;
    return M_TRUE;
}
/*****************************************************
    函数名称：bit PT2020_I2C_WaitCLKAW()
    函数功能：写数据前等待从机释放SCL
    入口参数：void
    出口参数：M_TRUE：成功等到从机释放SCL
              M_FAIL：等待从机释放SCL超时
******************************************************/
bit PT2020_I2C_WaitCLKAW(unsigned char u8_data)
{
    unsigned char i;
    SDA_OUT;
    if((u8_data & 0x80) == 0x80)
    {
        SDA = 1;
    }
    else
    {
        SDA = 0;
    }
    SCL_IN;
    delay_us(1);
    while(SCL != 1)
    {
        i++;
        if(i>300)
        {
            return M_FAIL;
        }
    }
    SCL = 1;
    return M_TRUE;
}



